// 后端文件名编码处理示例
// 文件：backend-filename-encoding-example.js

/**
 * 文件名编码处理工具
 * 用于解决中文文件名在数据库存储时的乱码问题
 */

// 解码文件名（从前端传来的编码文件名）
function decodeFileName(encodedFileName) {
  try {
    // 检查是否为编码后的文件名
    if (encodedFileName.includes('%')) {
      // URL 解码
      const decodedName = decodeURIComponent(encodedFileName)
      console.log('解码文件名:', encodedFileName, '->', decodedName)
      return decodedName
    }
    
    // 如果不是编码后的文件名，直接返回
    return encodedFileName
  } catch (error) {
    console.error('文件名解码失败:', error)
    return encodedFileName
  }
}

// 编码文件名（用于存储或传输）
function encodeFileName(fileName) {
  try {
    // 检查是否包含中文字符
    const hasChinese = /[\u4e00-\u9fa5]/.test(fileName)
    
    if (hasChinese) {
      // 对中文文件名进行编码
      const encodedName = encodeURIComponent(fileName)
      console.log('编码文件名:', fileName, '->', encodedName)
      return encodedName
    }
    
    return fileName
  } catch (error) {
    console.error('文件名编码失败:', error)
    return fileName
  }
}

// 文件上传处理示例
function handleFileUpload(req, res) {
  try {
    const file = req.file
    
    if (!file) {
      return res.status(400).json({ error: '没有文件上传' })
    }
    
    // 解码文件名
    const originalFileName = decodeFileName(file.originalname)
    const encodedFileName = encodeFileName(originalFileName)
    
    console.log('原始文件名:', file.originalname)
    console.log('解码后文件名:', originalFileName)
    console.log('存储用文件名:', encodedFileName)
    
    // 保存文件信息到数据库
    const fileInfo = {
      originalName: originalFileName,  // 存储解码后的原始文件名
      filename: encodedFileName,       // 存储编码后的文件名（用于文件系统）
      path: file.path,
      size: file.size,
      mimeType: file.mimetype,
      uploadedBy: req.user.id,
      createdAt: new Date()
    }
    
    // 这里应该保存到数据库
    // await saveFileToDatabase(fileInfo)
    
    res.json({
      success: true,
      message: '文件上传成功',
      file: fileInfo
    })
    
  } catch (error) {
    console.error('文件上传处理失败:', error)
    res.status(500).json({ error: '文件上传失败' })
  }
}

// 获取文件列表时的处理
function getFileList(req, res) {
  try {
    // 从数据库获取文件列表
    // const files = await getFilesFromDatabase()
    
    // 示例数据
    const files = [
      {
        id: '1',
        originalName: '公司组织架构库安装.pdf',
        filename: '%E5%85%AC%E5%8F%B8%E7%BB%84%E7%BB%87%E6%9E%B6%E6%9E%84%E5%BA%93%E5%AE%89%E8%A3%85.pdf',
        path: '/uploads/files/company-structure.pdf',
        size: 1024000,
        mimeType: 'application/pdf'
      }
    ]
    
    // 返回文件列表时，确保 originalName 是解码后的正确文件名
    const processedFiles = files.map(file => ({
      ...file,
      // 如果 originalName 是编码的，进行解码
      originalName: decodeFileName(file.originalName)
    }))
    
    res.json({
      success: true,
      files: processedFiles
    })
    
  } catch (error) {
    console.error('获取文件列表失败:', error)
    res.status(500).json({ error: '获取文件列表失败' })
  }
}

// 数据库存储示例（MySQL）
const mysql = require('mysql2/promise')

async function saveFileToDatabase(fileInfo) {
  const connection = await mysql.createConnection({
    host: 'localhost',
    user: 'your_username',
    password: 'your_password',
    database: 'your_database',
    charset: 'utf8mb4' // 重要：使用 utf8mb4 字符集
  })
  
  try {
    const [result] = await connection.execute(
      'INSERT INTO files (original_name, filename, path, size, mime_type, uploaded_by, created_at) VALUES (?, ?, ?, ?, ?, ?, ?)',
      [
        fileInfo.originalName,  // 解码后的原始文件名
        fileInfo.filename,      // 编码后的文件名
        fileInfo.path,
        fileInfo.size,
        fileInfo.mimeType,
        fileInfo.uploadedBy,
        fileInfo.createdAt
      ]
    )
    
    return result.insertId
  } finally {
    await connection.end()
  }
}

// 数据库表结构示例
const createTableSQL = `
CREATE TABLE files (
  id INT AUTO_INCREMENT PRIMARY KEY,
  original_name VARCHAR(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  filename VARCHAR(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
  path VARCHAR(1000) NOT NULL,
  size BIGINT NOT NULL,
  mime_type VARCHAR(100) NOT NULL,
  uploaded_by INT NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  INDEX idx_uploaded_by (uploaded_by),
  INDEX idx_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
`

module.exports = {
  decodeFileName,
  encodeFileName,
  handleFileUpload,
  getFileList,
  saveFileToDatabase
}
